
// es7+ 定义类：
class Person{
    // 声明类的实例属性(对象的属性)
    public name:string="张超战";//public：表示公共的，任何地方都可以使用，既就是没有做限制，默认值就public
    private age:number;//private：表示私有的，只能在类的内部（定义类时的那一对花括号）使用。
    sex:string;
    protected weight:number //protected：表示受保护的。只能在类内部和子类内部使用。

    // 声明类静态属性(类的属性)
    static count:number = 12;
    

    constructor(name:string,age:number){
        // 此处是给name属性赋值；
        this.name =name;
        this.age = age;
        this.sex = "男";
    }

    // 声明类的实例方法
    eat(food:string):void{
        console.log(this.name+"在吃"+food+"，天在看……………………");        
    }

    setAge(age:number){
        // 限制属性age的取值范围了。
        if(age<0 || age>150){
            return;
        }
        this.age = age;
    }

    getAge(){
        return this.age;
    }

    // 声明静态方法（类的方法）；
    static total(){

    }

}

// 用类名访问静态成员（静态属性和静态方法）
Person.count;
Person.total();

let pp1:Person = new Person("杨永博",16);

pp1.name = "张杰";

// pp1.height = 180;//不行，因为，类里面没有声明该属性。

// pp1.age = 18;//不行，因为，age是私有的（private）

// pp1.weight = 75;//不行，因为，weight用protected保护起来了。

pp1.eat("馒头");

// pp1.drink();


class Programmer extends Person{
    language:string;
    constructor(name:string,age:number,language:string){
        super(name,age);

    }

    writeCode(){
        console.log("this.name",this.name);//可以，因为name在父类里是公共的（public)，既就是：子类可以使用
        
        console.log("this.weight",this.weight);//可以，因为weight在父类里是受保护的(protected)，既就是：子类可以使用。

        console.log("this.age",this.age);//不行，因为age在父类里是私有的(private)，既就是：子类不能使用       
        
    }
}

// 一、用接口的方式自定义类型

interface IPerson{
    name:string,
    age?:number,
    readonly sex:string,
    isAdult:boolean,
    eat:(food:string)=>void
}

let p1:IPerson = {
    name:"葛佳敏",
    age:18,
    sex:"女",
    isAdult:false,
    eat:function(food:string):void{
        console.log("吃"+food);
        
    }
}


p1.age = 16;
// p1.sex="男"; //不行

p1.eat("油条");


// 二、用type的方式自定义类型

type IBook = {
    name:string,
    author:string,
    price:number,
    pusblish?:string
}

let b1:IBook ={
    name:"西厢记",
    author:"韩琴",
    price:58.2,
    pusblish:"千锋出版社"
}